iT邦幫忙

2

用定序解決SQL Server查詢 未分大小寫的問題

Vivi 2023-08-12 00:56:155277 瀏覽
  • 分享至 

  • xImage
  •  

前言

前幾天在SQL下了一句簡單的查詢:

SELECT * FROM USER WHERE NAME = 'Vivi'

出來的結果竟然是

Id Name
1 Vivi
2 vivi

沒有區分大小寫!!
查了一下原來是定序的問題,以前用資料庫都是得過且過,完全不知道定序QQ
所以這篇文章分享給
跟我一樣的人XD

定序是什麼?

簡單來說定序就是你下Order By時的排序規則,還有下Where條件時,預設幫你決定是否區分大小寫區分全半形等。

這邊貼SSMS的說明給大家,如果覺得我寫得不夠清楚的,也可以直接看官方的說明哦!
SSMS 定序與 Unicode 支援

在SQL Server中預設定序是以作業系統的地區設定來做為基礎,如果你的系統語言是en-US,預設的定序就是SQL_Latin1_General_CP1_CI_AS,台灣的話則是Chinese_Taiwan_Stroke_CI_AS

想看更多地區預設的定序點我!

接下來說說定序後面的那些參數:

如果要用這些參數,前面記得要加底線,EX:Latin1_General_CI_AI_KS

  • CI:不區分大小寫。
  • CS:區分大小寫。
  • AS:區分有腔調及無腔調的字元,例如,「a」不等於「ấ」。
  • AI:不區分腔調字元。
  • KS:區分日文平假名與片假名,省略就是不區分。
  • WS:區分全形與半形,省略就是不區分。

以上列幾個比較常用的給大家,想知道更多可以去看官方說明

順帶一提,台灣的定序有兩種:Chinese_Taiwan_BopomofoChinese_Taiwan_Stroke

  • Chinese_Taiwan_Bopomofo:用ㄅㄆㄇㄈ進行排序。
  • Chinese_Taiwan_Stroke:用筆畫進行排序。

看到這邊應該已經知道前言的問題是出在哪了吧?
沒錯!就是我的定序給到CI啦~~~~
那要怎麼修正呢?辦法有兩種:

  1. 直接從屬性改資料庫的定序。
  2. 查詢後面加COLLATE強制改變定序。

從屬性改資料庫的定序

第一種方法也是最簡單的方法,直接改資料庫定序,永無後患~
設定路徑:對資料庫右鍵 -> 屬性 -> 選項 -> 定序
https://ithelp.ithome.com.tw/upload/images/20230812/20161816Z7Jg6DpR2P.png
挑一個自己想要的定序就可以按確定囉!

COLLATE強制改變定序

如果今天只是有特定幾個條件需要改變定序,那COLLATE就會是很好的方法!
直接提供程式碼給大家看:

SELECT * FROM USER WHERE NAME = 'Vivi' COLLATE Latin1_General_CS_AS;

輸出結果:

Id Name
1 Vivi
SELECT * FROM USER Order By Name COLLATE Latin1_General_CS_AS;

輸出結果:

Id Name
1 vivi
2 Vivi

注意:COLLATE是要在每組條件個別加,不是在SQL最後寫一次就會讓所有的比對都區分大小寫。

SELECT * FROM USER
WHERE NAME = 'Vivi' COLLATE Latin1_General_CS_AS
Order By Name COLLATE Latin1_General_CS_AS;

那以上就是這次的分享啦!
資料來源都是SSMS的文件,文章內也有貼連結,有興趣可以直接看官方說明哦~


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言